package JavaEE.NetWork5;

// 抓包软件:"代理程序"
// 比如:我妈炒菜用酱油,没空去买,让我去买.此时"我"就是"代理程序"
// 正常:我妈拿钱给老板,老板拿酱油给我妈. 代理:我妈拿钱给我,我给老板,老板把酱油给我,我给我妈
// 代理分成两类:
// "正向代理"(代替客户端干活 -> 我代替我妈去买酱油)
// "反向代理"(代替服务器干活 -> 我代替老板看店)
// 一个网页通常由三个部分构成
// HTML:网页结构 骨
// CSS:网页的样式 皮(包括但不限于 颜色,字体,对齐方式,位置,边距...)
// JavaScript:网页的交互 魂(用户与网页之间的交互方式)
// 一个计算机访问存储设备的速度:CPU 寄存器,内存,硬盘,网络
// 加载一个页面,需要把HTML,CSS,JS都加载出来,页面才能正确显示.(为了优化,引入"浏览器缓存")
// 浏览器缓存:第一次访问,将上述资源都加载,后续再访问,只从服务器中获取html即可,css/js直接用上次获取过的
//
// ----------
//
// HTTP(超文本传输协议) -> (基于文本格式的协议)
// [TCP,UDP,以太网,IP...都是基于二进制格式的协议]
// 超文本:文本中包含了一些更复杂的内容(图片,视频,音频,特殊字体,链接...)
// HTTP是"应用层协议",传输层依赖TCP来进行实现(2.0及其之前,3.0基于UDP)
//
// HTTP请求格式
// 1.首行(请求的第一行)
// 2.请求报头(header)从第二行开始,往后若干行
// 3.空行(请求头的结束标记)
// 4.请求正文(body)[可能有,可能没有]
//
// HTTP响应格式(可能被压缩)
// 压缩的原因:网络通信过程中,最贵的硬件资源就是"网络带宽".
// 直接把原始数据进行传输,太多了,消耗的网络带宽就多.所以对数据进行压缩,压缩后数据变少
// 通过网络传输的内容也少了,数据到了对端再通过cpu来进行解压缩(用cpu换网络带宽,减少成本)
// 1.首行
// 2.响应报头(header)
// 3.空行(响应头的结束标记)
// 4.正文
//
// ----------
//
// HTTP请求(Request)
// 1.URL(唯一资源定位符)
//   描述了网络上的某个资源的具体位置,需要明确访问网络上的哪个资源
//   如:http://www.example.jp:80/dir/index.htm?uid=1#ch1
//   协议方案名:(http://)
//   服务器地址:(www.example.jp)
//   服务器端口号:(80)
//   带层次的文件路径:(dir/index.htm)
//   (一个机器上的一个服务器程序可能管理很多资源,可能是"真是的文件"
//   ,也可能是"虚拟的","动态生成"的资源(根据需求计算出的响应))
//   查询字符串:(uid=1)
//   (请求中的参数,通过参数进行进一步的解释说明(
//   键值对格式: "=" 分割键和值, "&" 分割多个键值对))
//   片段标识符:(ch1)
//   (标识网页的某个部分,实现"页面内跳转"功能,文档类网站会带)
// 完整的URL包含了很多信息,重点关心的主要是4个部分
//  1)IP:
//  2)端口:
//   (URL中目的端口如果不写,浏览器会给默认值,根据协议类型确定:
//   "http:// => 80" , "https:// => 443")
//  3)路径:
//  (带层次的路径也能省略,省略之后,其实是一个'/',表示"根目录",通常对应到一个页面的主页)
//  4)查询字符串:(本身不是必须的)
//
// ----------
//
// URL encode
// 一种将特殊字符转换为百分号编码的方法，以便浏览器和服务器之间能够正确地处理它们。
// url 的 query string 中的 value 部分,可能需要进行"转义"的.
// query string的内容,程序员可以自定义(尤其是value),如果value中
// 包含特殊符号,就可能使url的解析出现错误.(url中的特殊符号有特定含义)
// 中文也需要转义(中文通过 utf8/gbk 之类的编码格式表示的,有可能某个
// 汉字的 utf8/gbk 编码中的某个字节,恰好和某个特殊符号的 ascii码 相同了)
//
// HTTP的方法
// 1.GET:从服务器获取某个资源(最常见)
//  -----触发HTTP GET请求的常见情景:-----
//  1)直接在浏览器地址栏输入url
//  2)在页面点击一些链接跳转
//  3)HTML间接加载其他资源(CSS,JS,图片...)
//  4)通过代码手动构造GET请求
//  -----GET请求的特点:-----
//  1)GET请求一般没有body(正文)(自己创建GET请求并添加body可行,但没必要)
//  2)GET请求想要给服务器传递数据,往往通过(路径/query string)进行传递.
//  如两篇相同作者的不同博客:
//  (https://blog.csdn.net/ixiaotang_/article/details/146907631)
//  (https://blog.csdn.net/ixiaotang_/article/details/147245836)
// 2.POST:向服务器上传xxx个资源(第二常见)
//  -----触发HTTP POST请求的常见情景:-----
//  1)登陆的时候(body提交的是用户名和密码)
//  2)上传资源/文件(boyd提交的是图片或资源内容)
//  -----(二进制通过 base64 编码,变成文本)的原因和规则-----
//  body其实可以放二进制数据(压缩的结果),而(通过base64转文本)的原因
//  其实是因为(图片或资源本身较小),按照文本的方式,服务器代码处理起来好实现.
//  base64:(将二进制数据用文本"ascii字符"进行重新编码,通过4个字符表示原来3个字节的二进制数据)
//  -----POST请求的特点:-----
//  1)带有body,通过body给服务器传输数据
//  2)不太需要query string传递了,通常情况下,没有query string(不绝对)
// 3.PUT:向服务器上传xx资源(文件)
//  和POST差不多是一样的
// 4.DELETE:删除服务器的xxx资源
//  和GET类似,一般不带有body,通过query string传递数据
//
// ----------谈谈 GET 和 POST 的区别?----------
// 核心结论:GET 和 POST 其实没有本质区别,只是HTTP的两个不同的方法
// 大部分情况下,使用GET的场景,也可以替换成POST,使用POST的场景,也可以替换成GET
// 但是从使用习惯讲.存在差异
// 1)GET 通常没有 body,通过 query string 传递数据给服务器//
//   POST 通常有 body,不需要通过 query string 传递数据.
// 2)语义上的区别(GET表示"获取",POST表示"提交")
// 幂等:请求一定,得到的响应结果就一定.
// *幂等性:GET 请求官方建议实现成"幂等的",POST 请求无要求.
// *可缓存(承接幂等):GET 如果实现成幂等,就可以把结果缓存起来,POST 不实现成幂等,就不能缓存.
//                (如果不幂等还缓存,可能导致"应该拿到新结果"时,反而"拿到旧结果")
// *数据的类型:GET 传输数据的时候,通过query string只能传输文本(虽然不行,但可以url encode)
//           POST 通过 body 传输数据,也可以传二进制.
//
// -----Restful 风格的 API 设计规范-----
// 1.通过请求中的方法表示不同的语义.
//  GET:查询 POST:新增 PUT:修改 DELETE:删除
// 2.通过URL的路径,表示操作的资源.
//  https://www.bilibili.com/video/BV1fhVQzFEmE/
// 3.请求和响应要去携带的数据,都尽量使用json格式的数据.
// 4.通过HTTP响应的状态码,表示失败的原因
//
//
//
public class Demo1 {
}
